$(function() {
    // 初始化数据
    initListTsRole();
    // add 角色新增
    $(".add").off("click");
    $(".add").on("click", addRole);

    // remove 角色删除
    $(".remove").off("click");
    $(".remove").on("click", removeTsRole);

    // 保存权限分配
    $("#save-role-menu").off("click");
    $("#save-role-menu").on("click", saveRoleMenu);




    /**
     *  新增角色
     */
    function addRole(){
        var url = path + "/system/tsRole/addTsRole";
        $.loadContentMain(url);
    }

    /**
     * 将所有选中菜单赋值
     */
    function saveRoleMenu(){
        var roleId = $('#role-menu-modal').attr('roleId') ;
        var treeContent = $('#allot-menu') ;
        var getCheckedArr = treeContent .treeview('getChecked');
        if(getCheckedArr.length > 0){
            /*
            * 保存菜单所有的信息
            * */
            var url = path + "/system/tsRoleMenu/ajaxAddTsRoleMenu" ;
            var data = {
                roleId:roleId,
                treeViewList:JSON.stringify(getCheckedArr)
            }
            /**
             * 保存权限分配
             */
            $.post(url,data,function(result){
                if(result.state){
                    layer.alert(result.msg, {icon: 6});
                }else{
                    layer.alert(result.msg, {icon: 6});
                }
            });
        }else{
            $('#role-menu-modal').modal('hide');
        }
    }

    /**
    * @methodname removeTsRole
    * @Description {角色删除方法}
    * @author 黄学乾
    * @create 2018/4/30/030 21:56
    */
    function removeTsRole(){
        var tsRoleList =  $('#ts-role-table').bootstrapTable('getSelections');
        if(tsRoleList.length == 0){
            layer.msg('未选中要删除的角色', {icon: 5});
        }else{
            var url = path + "/system/tsRole/ajaxDelTsRole";
            var data ={
                tsRoleList:JSON.stringify(tsRoleList)
            }
            $.post(url,data,function(result){
                if(result.state){
                    layer.alert(result.msg, {icon: 6});
                    $.loadContentMain(path + "/system/tsRole/listTsRole");
                }else{
                    layer.alert(result.msg, {icon: 6});
                }
            });
        }
    }
    // 初始化 角色列表
    function initListTsRole(){
       $('#ts-role-table').bootstrapTable({
           method : 'post',// 向服务器请求方式
           contentType : "application/x-www-form-urlencoded",  // 如果是post必须定义
           url : path + "/system/tsRole/ajaxListTsRole",   // 请求url
           cache : false, // 是否使用缓存，默认为true，所以一般情况下需要设置一下这个属性（*）
           striped : true, // 隔行变色
           dataType : "json",  // 数据类型
           pagination : true,  // 是否启用分页
           showPaginationSwitch : false, // 是否显示 数据条数选择框
           pageSize : 10, // 每页的记录行数（*）
           pageNumber : 1,     // table初始化时显示的页数
           pageList: [5, 10, 15, 20], //可供选择的每页的行数（*）
           search : false, // 不显示 搜索框
           sidePagination : 'server', // 服务端分页
           classes : 'table table-bordered', //  Class样式
           silent : true,                   //  必须设置刷新事件
           toolbar : '#toolbar',            //  工具栏ID
           toolbarAlign : 'right',          //  工具栏对齐方式
           queryParams : queryParams,       //  请求参数，这个关系到后续用到的异步刷新
           columns : [
               {field: 'state',
                checkbox: true,
                align: 'center',
               }, {
                   field: 'roleName',
                   title: '角色名称'
               }, {
                   field: 'roleDesc',
                   title: '描述'
               }, {
                   field: 'parentRoleName',
                   title: '父级角色'
               }, {
                   field: 'roleType',
                   title: '角色类型',
                   formatter: roleTypeFormatter
               }, {
                   field: 'creator',
                   title: '创建人'
               }, {
                   field: 'createTime',
                   title: '创建时间'
               }, {
                   field: 'modifyer',
                   title: '修改人'
               }, {
                   field: 'modifyTime',
                   title: '修改时间'
               }, {
                   field: 'roleId',
                   title: '操作',
                   align: 'center',
                   events: window.operateEvent = {
                       'click .edit': edit ,
                       'click .role-user': function (e,value,row,index) {
                           $('#role-user-modal').modal('show');
                       },
                       'click .role-menu': function (e,value,row,index) {
                           var url =  path + "/system/tsMenu/ajaxMenuTreeViewByTsRole?roleId="+value ;
                           $.getJSON(url, function(data) {
                               $('#role-menu-modal').attr('roleId',value);
                               //判断当前
                               $('#role-menu-modal').modal({backdrop:'static', keyboard: false});
                               $('#allot-menu').treeview({
                                   data: data ,
                                   showIcon: true ,
                                   showCheckbox: true ,
                                   onNodeChecked: function(event, node) {
                                       var $treeContent = $("#allot-menu");
                                       var selectNodes = getChildNodeIdArr(node); //获取所有子节点
                                       if (selectNodes) { //子节点不为空，则选中所有子节点
                                           $treeContent.treeview('checkNode', [selectNodes, { silent: true }]);
                                       }
                                       var parentNode = $treeContent.treeview("getNode", node.parentId);
                                       setParentNodeCheck(node,$treeContent);
                                   },
                                   onNodeUnchecked: function (event, node) {
                                       var $treeContent = $("#allot-menu");
                                       debugger
                                       // 取消父节点 子节点取消
                                       var selectNodes = setChildNodeUncheck(node); // 获取未被选中的子节点
                                       var childNodes = getChildNodeIdArr(node);    // 获取所有子节点
                                       if (selectNodes && selectNodes.length==0) { //有子节点且未被选中的子节点数目为0，则取消选中所有子节点
                                         console.log("反选");
                                           $treeContent.treeview('uncheckNode', [childNodes, { silent: true }]);
                                          }
                                      // 取消节点 父节点取消
                                        var parentNode = $treeContent.treeview("getNode", node.parentId);  //获取父节点
                                        var selectNodes = getChildNodeIdArr(node);
                                        setParentNodeCheck(node,$treeContent);
                                   }
                               });
                           });
                       }
                   },
                   formatter: operateFormatter,
               } ],
       });
   }
    /**
     * @param e 修改角色
     * @param value
     * @param row
     * @param index
     */
    function edit (e,value,row,index){
        var url = path + "/system/tsRole/editTsRole?roleId="+value;
        $.loadContentMain(url);
    }

    function operateFormatter(){
        return [
            '<button type="button" class="edit btn btn-default  btn-sm" style="margin-right:15px;"><i class="glyphicon glyphicon-edit"></i>编辑</button>',
            '<button type="button" class="role-user btn btn-default  btn-sm" style="margin-right:15px;"><i class="glyphicon glyphicon-user"></i>成员管理</button>',
            '<button type="button" class="role-menu btn btn-default  btn-sm" style="margin-right:15px;"><i class="glyphicon glyphicon-lock"></i>权限配置</button>',
        ].join('');
    }


    /**
     * 格式化角色类型
     * @param value
     */
    function roleTypeFormatter (value, row, index){
            var temp="-";
            if(!value){
                temp="-";
            }else if(value==1){
                temp="超级管理员";
            }else if(value==2){
                temp="管理员";
            }else if(value==3){
                temp="普通角色";
            }
            return temp;
    }
    // 查询参数初始化
    function queryParams(params) {
        return {
            name : 1,    // 请求时向服务端传递的参数
            seqNo : 1,
            limit : params.limit, // 每页显示数量
            offset : params.offset, // SQL语句偏移量
        }
    }


    function getChildNodeIdArr(node) {
        var ts = [];
        if (node.nodes) {
            for (x in node.nodes) {
                ts.push(node.nodes[x].nodeId);
                if (node.nodes[x].nodes) {
                    var getNodeDieDai = getChildNodeIdArr(node.nodes[x]);
                    for (j in getNodeDieDai) {
                        ts.push(getNodeDieDai[j]);
                    }
                }
            }
        } else {
            ts.push(node.nodeId);
        }
        return ts;
    }

    // 选中所有子节点时，选中父节点 取消子节点时取消父节点
    function setParentNodeCheck(node,$Content) {
        var parentNode = $Content.treeview("getNode", node.parentId);
        if (parentNode.nodes) {
            var checkedCount = 0;
            for (x in parentNode.nodes) {
                if (parentNode.nodes[x].state.checked) {
                    checkedCount ++;
                } else {
                    break;
                }
            }
            if (checkedCount == parentNode.nodes.length) {  //如果子节点全部被选 父全选
                $Content.treeview("checkNode", parentNode.nodeId);
                setParentNodeCheck(parentNode);
            }else {   //如果子节点未全部被选 父未全选
                $Content.treeview('uncheckNode', parentNode.nodeId);
                setParentNodeCheck(parentNode);
            }
        }
    }

    // 取消父节点时 取消所有子节点
    function setChildNodeUncheck(node) {
        debugger
        if (node.nodes) {
            var ts = [];    //当前节点子集中未被选中的集合
            for (x in node.nodes) {
                if (!node.nodes[x].state.checked) {
                    ts.push(node.nodes[x].nodeId);
                }
                if (node.nodes[x].nodes) {
                    var getNodeDieDai = node.nodes[x];
                    console.log(getNodeDieDai);
                    for (j in getNodeDieDai) {
                         if(getNodeDieDai.nodes[x]!=undefined){
                             if (!getNodeDieDai.nodes[x].state.checked) {
                                 ts.push(getNodeDieDai[j]);
                             }
                         }
                    }
                }
            }
        }
        return ts;
    }



});



